From e436b0962269bd1993364f94b3f4243050aacc91 Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Fri, 5 May 2006 15:15:56 +0100 Subject: [PATCH] Add more in_irq() checking. Add irq_enter()/irq_exit() where they are missing in a few places. Signed-off-by: Keir Fraser --- xen/arch/x86/domain.c | 3 +++ xen/arch/x86/smp.c | 6 ++++++ xen/arch/x86/traps.c | 2 ++ 3 files changed, 11 insertions(+) diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index 3e3a61f59b..bd4b6f08ab 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -753,7 +753,10 @@ int __sync_lazy_execstate(void) switch_required = (this_cpu(curr_vcpu) != current); if ( switch_required ) + { + ASSERT(current == idle_vcpu[smp_processor_id()]); __context_switch(); + } local_irq_restore(flags); diff --git a/xen/arch/x86/smp.c b/xen/arch/x86/smp.c index 53dec24c38..590e35921e 100644 --- a/xen/arch/x86/smp.c +++ b/xen/arch/x86/smp.c @@ -169,6 +169,7 @@ fastcall void smp_invalidate_interrupt(void) { ack_APIC_irq(); perfc_incrc(ipis); + irq_enter(); if ( !__sync_lazy_execstate() ) { if ( flush_va == FLUSHVA_ALL ) @@ -177,6 +178,7 @@ fastcall void smp_invalidate_interrupt(void) local_flush_tlb_one(flush_va); } cpu_clear(smp_processor_id(), flush_cpumask); + irq_exit(); } void __flush_tlb_mask(cpumask_t mask, unsigned long va) @@ -335,6 +337,8 @@ fastcall void smp_call_function_interrupt(struct cpu_user_regs *regs) if ( !cpu_isset(smp_processor_id(), call_data->selected) ) return; + irq_enter(); + if ( call_data->wait ) { (*func)(info); @@ -347,4 +351,6 @@ fastcall void smp_call_function_interrupt(struct cpu_user_regs *regs) atomic_inc(&call_data->started); (*func)(info); } + + irq_exit(); } diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c index 76aa48d4cb..64ab6b69bc 100644 --- a/xen/arch/x86/traps.c +++ b/xen/arch/x86/traps.c @@ -674,6 +674,8 @@ asmlinkage int do_page_fault(struct cpu_user_regs *regs) unsigned long addr, fixup; int rc; + ASSERT(!in_irq()); + __asm__ __volatile__ ("mov %%cr2,%0" : "=r" (addr) : ); DEBUGGER_trap_entry(TRAP_page_fault, regs); -- 2.30.2